package com.zym.init.core.plugin.storage.engine;

import com.zym.init.core.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.List;
import java.util.Map;

/**
 * 本地存储引擎
 */
@Slf4j
public class LocalStorage {

    /**
     * 映射目录
     */
    private final String directory;

    public LocalStorage(Map<String, String> config) {
        if (StringUtils.isBlank(config.get("storage_path"))) {
            throw new ServiceException("请配置存储路径");
        }
        this.directory = config.get("storage_path");
    }


    /**
     * 本地上传
     *
     * @param multipartFile 上传对象
     * @param saveDir       保存路径 {username}/{datetime} or {datetime}
     * @param fileName      文件名称 name.jpg
     */
    public void upload(MultipartFile multipartFile, String saveDir, String fileName) {
        // 检查映射目录
        checkDirectory(directory);

        // 保存路径
        String savePath = (directory + "/" + saveDir + "/").replace("\\", "/");

        // 创建目录
        File fileExist = new File(savePath);
        if (!fileExist.exists()) {
            if (!fileExist.mkdirs()) {
                throw new ServiceException("创建目录失败");
            }
        }

        // 保存文件
        try {
            File dest = new File(savePath, fileName);
            multipartFile.transferTo(dest);
        } catch (Exception e) {
            throw new ServiceException("上传文件失败:" + e.getMessage());
        }

    }

    /**
     * 检查映射目录
     *
     * @param directory 映射目录 C://system/upload
     */
    private void checkDirectory(String directory) {
        // 检查映射目录
        if (directory == null || directory.isEmpty()) {
            throw new ServiceException("请配置上传目录");
        }
    }

    /**
     * 本地删除
     *
     * @param paths 路径
     */
    public void delete(List<String> paths) {
        // 检查映射目录
        checkDirectory(directory);

        for (String path : paths) {
            // 删除文件
            File file = new File(directory + "/" + path);

            // 判断文件是否存在
            if (file.exists()) {
                // 删除文件
                if (!file.delete()) {
                    log.error("删除文件失败: {}", file.getAbsolutePath());
                }
            }
        }
    }
}
